<!DOCTYPE html>
<script src="../../../resources/js-test.js"></script>
<style>
.a + .b { color: green; }
.c + .d { color: green; }
.e { color: green; }
</style>
<div id="t1">
    <div></div>
    <div class="b"></div>
</div>
<div id="t2">
    <div>
        <div></div>
        <div class="d"></div>
    </div>
    <div>
        <div class="e"></div>
    </div>
</div>
<div id="t3">
    <div>
        <div></div>
        <div class="d"></div>
    </div>
    <div>
        <div class="a"></div>
        <div class="b"></div>
    </div>
</div>
<script>
description("Check that getComputedStyle causes a style recalc when necessary, and only when necessary.");

var green = "rgb(0, 128, 0)";

// Check that sibling recalc for .b is performed before computed style is returned.

document.body.offsetTop;
document.body.querySelector("#t1 > div").className = "a";
shouldBe("getComputedStyle(document.body.querySelector('#t1 .b')).color", "green", true);
if (window.internals)
    shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "0");

// No style invalidation or recalc scheduled for an ascendant of .e, and no affected-by-adjacent
// bits set on any ascendants, hence we don't need to do a recalc even if a style invalidation
// is scheduled for the .c change with adjacent implications.

document.body.offsetTop;
document.body.querySelector("#t2 > div > div").className = "c";
shouldBe("getComputedStyle(document.body.querySelector('#t2 .e')).color", "green", true);
if (window.internals)
    shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "1");

// No style invalidation or recalc scheduled for an ascendant of .b, and even if affected-by-adjacent
// bits are set on the ascendant (because of a+b), it doesn't matter since that ascendant does
// not have any children that needs style recalc or invalidation.

document.body.offsetTop;
document.body.querySelector("#t3 > div > div").className = "c";
shouldBe("getComputedStyle(document.body.querySelector('#t3 .b')).color", "green", true);
if (window.internals)
    shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "1");

</script>
